#include <stdio.h>

// 指针类型的必要性；野指针

/*
    int* test(){
        int a = 10;
        // 警告：函数返回局部变量的地址
        return &a;
    }
*/

int main()
{
    // 指针都是占4/8个字节，为什么要区分类型int* char*？
    // 1、指针类型决定了指针进行解引用操作的时候，能够访问空间的大小。int *p : 解引用能访问4个字节；char *p : 解引用能访问1个字节；
    // 2、指针类型决定了指针的步长。int *p :p+1 -> 相当于移动了4个地址；char *p : p+1 -> 相当于移动了1个地址。

    // 野指针：指针指向的位置是不可知的（随机的、不正确的、没有明确限制的）。
    // 1、局部的指针变量不初始化，就被初始化随机值
    // 2、当指针指向的范围超出数组arr的范围时，p就是野指针。
    // 3、指针指向的空间被释放，也会成为野指针。
    // 如何避免野指针。
    // 1、指针要初始化；2、小心指针越界；3、指针指向空间释放及时置为NULL；4、指针使用之前检查有效性。

    int a ; // 局部变量不初始化，默认是随机值。
    printf("a = %d\n ", a);
    int *pointer; //局部的指针变量不初始化，就被初始化随机值
    *pointer = 20;
    printf("pointer p = %p\n ", pointer);
    printf("pointer d = %d\n ", *pointer);

    int arrp[10] = {0};
    int *ppp = arrp;
    for(int i=0;i<=11;i++){
        *(ppp++) = i; // 当指针指向的范围超出数组arr的范围时，p就是野指针。
    }

    // int *pp = test(); // 局部变量a出函数test后，空间被释放，还给系统。即a的指针指向的空间被释放。

    int *pp = NULL; // NULL - ((void *)0) 用来初始化指针，给指针赋值
    if(pp != NULL){ // 使用指针时，校验其有效性

    }
    
    return 0;
}